package base.regex.demo01;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author zjw
 * @date 2022/3/25 18:03
 * @des 正则使用案例
 */
@Slf4j
public class TestCase {
    @Test
    public void testCase1(){
        log.info("---------------1. 匹配手机号码----------------");
        /**
         * 匹配手机号的有几种写法
         * 1(3|7|8)[0-9]{9}
         * 1[378][0-9]{9}
         */
        String regex = "1[378]\\d{9}";
        System.out.println("17356572845".matches(regex));
        System.out.println("12345678909".matches(regex));

        log.info("---------------2.字符串分割:@----------------");
        regex = "@+";
        String[] ss = "张三@@@李四@@王五@茅台".split(regex);
        for (String s : ss) {
            System.out.println(s);
        }
        System.out.println(ss.length);
        log.info("---------------3. 叠词分割------------------");
//        regex = ".{2,}";//不是这样的
        /**
         * （）来表示组，那么我们就可以对组中的数据进行引用：regex = "(.)\\1"就表示：
         * 某一字符出现了两次(注意首先我们用(.)来表示任意字符，而\\1是对组(.)中的字符进行复用，合起来就是：两个相同的字符)，
         * 现在我们不只是需要出现两次的字符，所以使用+号来表示出现多次.
         */
        regex = "(.)\\1+";
        ss = "张三@@@李四￥￥王五ssss江流儿".split(regex);
        for (String s : ss) {
            System.out.println(s);
        }

        log.info("----------4.叠词替换为单个字符----------------");
        //将“张三@@@李四YYY王五*****王尼玛”中的叠词替换为单字符，即结果为：“张三@李四Y王五*王尼玛”
        regex = "(.)\\1+";
        System.out.println("张三@@@李四YYY王五*****王尼玛".replaceAll(regex, "$1"));
    }

    /**
     * 获取字符串 “Hi ! Don't be moved by yourself Fzz”中为两个字母的单词。即Hi、be、by.
     *
     * 我们要对子串进行匹配，即两个字母的单词，字母可以用[a-zA-Z]来表示，范围是两个，所以regex = "[a-zA-Z]{2}"。
     * 但这样不够准确，我们需要的是单词，而不是三个字母，所以要用到“边界匹配器”:
     *
     */
    @Test
    public void testCase2(){
        String s = "Hi! Don't be moved by yourself Fzz";
        String regex = "\\b[a-zA-Z]{2}\\b";

        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(s);

        while (matcher.find()) {
            System.out.println(matcher.group());
        }
    }

    /**
     * 将 我我我……我我……爱…爱爱……学…学……学编程 改为
     * 我爱学编程
     */
    @Test
    public void testCase3(){
        String s = "我我我......我我......爱...爱爱...学...学......学编程";
        String regex = "\\.";
        //1、首先去掉...(将.替换为""即可)
        String s1 = s.replaceAll(regex,"");
        //2、替代叠词
        regex = "(.)\\1+";
        String s2 = s1.replaceAll(regex, "$1");
        System.out.println(s2);
    }
}
